---@class UserConfig
local UserConfig = {
  colorscheme = "gruvbox", -- 颜色主题, "tokyonight" | "nord" | "onedark" | "gruvbox" | "nightfox" | "nordfox" | "duskfox" | "dracula"
  max_highlight_line_count = 5000, -- 最大高亮行数, 为了性能，默认值为 5000，对大文件禁用代码高亮显示
  enable_imselect = false, -- 自动切换输入法，默认值为 false
  enable_very_magic_search = false, -- 启用正则表达式搜索模式 ---@see https://www.youtube.com/watch?v=VjOcINs6QWs
  fix_windows_clipboard = false, -- 修复在 Windows WSL2 上的复制问题 ---@see https://stackoverflow.com/questions/44480829/how-to-copy-to-clipboard-in-vim-of-bash-on-windows
  ---@class Commonkeys 通用按键映射
  keys = {
    leader_key = " ", -- Leader键
    -- 快速保存文件 / 快速退出
    n_save = "<leader>w", -- :w
    n_force_quit = "<leader>q", -- :qa!
    -- 快速移动
    n_v_5j = "<C-j>",
    n_v_5k = "<C-k>",
    n_v_10k = "<C-u>",
    n_v_10j = "<C-d>",
    -- 代码折叠快捷键
    fold = {
      open = "zo",
      close = "zc",
    },
    terminal_to_normal = "<Esc>",
  },

  ---------------------------
  --  缓冲区 & 窗口 & 选项卡  --
  ---------------------------
  ---@class BufferLineConfig 插件用户配置
  bufferLine = {
    enable = true, -- 是否启用BufferLine
    keys = {
      -- 左 / 右循环切换
      prev = "<C-h>",
      next = "<C-l>",
      -- 关闭当前缓冲区
      close = "<C-w>",
      -- 关闭左 / 右侧所有标签页
      close_left = "<leader>bh",
      close_right = "<leader>bl",
      -- 关闭其他所有标签页
      close_others = "<leader>bo",
      close_pick = "<leader>bp", -- 选择并关闭特定标签页
    },
  },

  ---@class SWindowConfig
  s_windows = {
    enable = true, -- 是否启用窗口操作快捷键
    keys = {
      split_vertically = "sv", -- 垂直分割窗口
      split_horizontally = "sh", -- 水平分割窗口
      -- 关闭当前窗口
      close = "sc",
      -- 关闭其他窗口
      close_others = "so",
      -- 在窗口之间跳转
      jump_left = { "<M-h>", "<leader>h" },
      jump_right = { "<M-l>", "<leader>l" },
      jump_up = { "<M-k>", "<leader>k" },
      jump_down = { "<M-j>", "<leader>j" },
      -- 控制窗口大小
      width_decrease = "s,", -- 减小宽度
      width_increase = "s.", -- 增加宽度
      height_decrease = "sj", -- 减小高度
      height_increase = "sk", -- 增加高度
      size_equal = "s=", -- 等比例调整大小
    },
  },

  ---@class STabConfig
  s_tab = {
    enable = false, -- 是否启用标签页快捷键
    keys = {
      split = "ts", -- 在新标签页中分割
      prev = "th", -- 上一个标签页
      next = "tl", -- 下一个标签页
      first = "tj", -- 第一个标签页
      last = "tk", -- 最后一个标签页
      close = "tc", -- 关闭当前标签页
    },
  },

  ---@class CMPConfig 自动完成用户配置
  cmp = {
    enable = true, -- 是否启用自动补全
    -- 启用copilot自动补全
    copilot = false,
    -- 首次运行':Copilot auth'
    keys = {
      confirm = "<CR>", -- 确认补全
      select_next_item = "<Down>", -- 选择下一个补全项
      select_prev_item = "<Up>", -- 选择上一个补全项
      scroll_doc_up = "<C-u>", -- 向上滚动文档
      scroll_doc_down = "<C-d>", -- 向下滚动文档
      complete = "<M-.>", -- 触发补全
      abort = "<M-,>", -- 取消补全
      -- luasnip
      snip_jump_next = "<C-l>", -- 跳转到下一个代码片段
      snip_jump_prev = "<C-h>", -- 跳转到上一个代码片段
      snip_next_choice = "<C-j>", -- 选择下一个代码片段
      snip_prev_choice = "<C-k>", -- 选择上一个代码片段
      copilot_panel = "<leader>cpp", -- 打开copilot面板
    },
  },

  ---@class NotifyConfig 插件用户配置
  notify = {
    enable = true, -- 是否启用通知
    ---@type number in millionsecond
    timeout = 1500, -- 通知持续时间（毫秒）
    ---@type 'fade' | 'static' | 'slide'
    stages = "static", -- 通知出现的动画效果
    ---@type  'defalut' | 'minimal' | 'simple'
    render = "minimal", -- 通知的渲染样式
  },

  ---@class NvimTreeConfig 插件用户配置
  nvimTree = {
    enable = true, -- 是否启用NvimTree（文件浏览器）
    keys = {
      toggle = { "<M-m>", "<leader>m" }, -- 切换NvimTree显示/隐藏
      refresh = "R", -- 刷新NvimTree
      -- 打开 / 关闭 --
      edit = { "o", "<2-LeftMouse>" }, -- 编辑文件或目录
      close = "<BS>", -- 关闭父文件夹
      system_open = "<CR>", -- 在系统文件管理器中打开
      vsplit = "sv", -- 垂直分割窗口打开文件
      split = "sh", -- 水平分割窗口打开文件
      tabnew = "st", -- 在新标签页中打开文件
      -- 移动 --
      parent_node = "P", -- 跳转到父节点
      first_sibling = "K", -- 跳转到第一个同级节点
      last_sibling = "J", -- 跳转到最后一个同级节点
      cd = ">", -- 切换工作目录到选中的目录
      dir_up = "<", -- 切换工作目录到上一级目录
      -- 文件显示切换 --
      toggle_git_ignored = "i", -- 切换显示.gitignore中的文件
      toggle_dotfiles = ".", -- 切换显示隐藏文件（以点开头的文件）
      toggle_custom = "u", -- 切换自定义配置
      -- 文件操作 --
      create = "a", -- 新建文件或目录
      remove = "d", -- 删除文件或目录
      rename = "r", -- 重命名文件或目录
      cut = "x", -- 剪切文件或目录
      copy = "c", -- 复制文件或目录
      paste = "p", -- 粘贴文件或目录
      copy_name = "y", -- 复制文件名称
      copy_path = "Y", -- 复制文件路径
      copy_absolute_path = "gy", -- 复制文件绝对路径
      toggle_file_info = "gh", -- 切换显示文件信息
    },
  },

  ---@class TelescopeConfig
  telescope = {
    enable = true, -- 是否启用Telescope插件（强大的模糊查找器）
    keys = {
      -- 查找文件
      find_files = { "<C-p>", "ff" },
      -- 实时模糊搜索文字内容
      live_grep = "<C-f>",
      -- 高级实时模糊搜索（需要telescope-live-grep-args.nvim插件）
      live_grep_args = "sf",
      -- 上下移动选择
      move_selection_next = "<C-j>",
      move_selection_previous = "<C-k>",
      -- 搜索历史记录切换
      cycle_history_next = "<Down>",
      cycle_history_prev = "<Up>",
      -- 关闭Telescope窗口
      close = "<esc>",
      -- 在预览窗口中滚动
      preview_scrolling_up = "<C-u>",
      preview_scrolling_down = "<C-d>",
    },
  },

  ---@class SurroundConfig
  surround = {
    enable = true, -- 是否启用Surround插件（快速添加、删除或更改成对的符号，如引号、括号等）
    keys = {
      -- 添加成对符号
      normal = "ys", -- 普通模式下添加成对符号
      normal_cur = "yss", -- 普通模式下给当前行添加成对符号
      -- 删除成对符号
      delete = "ds", -- 删除成对符号
      -- 更改成对符号
      change = "cs", -- 更改成对符号
      -- 视觉模式下的操作
      visual = "s", -- 选择文本后添加成对符号
      visual_line = "gs", -- 选择文本行后添加成对符号
      -- 禁用操作
      insert = false, -- 插入模式下不启用
      insert_line = false, -- 插入模式下的行操作不启用
      normal_line = false, -- 普通模式下的行操作不启用
      normal_cur_line = false, -- 普通模式下当前行操作不启用
    },
  },

  ---@class VENNConfig
  venn = {
    enable = true, -- 是否启用VENN（用于绘制ASCII图的插件）
    keys = {
      -- 使用<leader>v切换VENN的按键绑定
      toggle = "<leader>v",
      -- 绘制时上下左右移动
      up = "K",
      down = "J",
      left = "H",
      right = "L",
      -- 在视觉模式下按"f"绘制盒子
      draw_box = "f",
    },
  },
  ---@class ZenConfig
  zen = {
    enable = true, -- 是否启用禅模式，一种无干扰的编程环境
    keys = {
      toggle = "<leader>z", -- 切换禅模式
    },
  },
  ---@class CommentConfig
  comment = {
    enable = true, -- 是否启用代码注释功能
    -- 普通模式下的切换键
    toggler = {
      line = "gcc", -- 切换行注释
      block = "gbc", -- 切换块注释
    },
    -- 视觉模式下的切换键
    opleader = {
      line = "gc", -- 切换行注释
      block = "gb", -- 切换块注释
    },
  },
  ---@class ToggleTermConfig
  toggleterm = {
    -- 启用3个内置终端，使用<leader>t a/b/c开关
    enable = true,
    toggle_float_window = "<leader>ta", -- 切换浮动终端窗口
    toggle_float_window_command = nil, -- 浮动终端窗口的自定义命令
    toggle_side_window = "<leader>tb", -- 切换侧边终端窗口
    toggle_side_window_command = nil, -- 侧边终端窗口的自定义命令
    toggle_bottom_window = "<leader>tc", -- 切换底部终端窗口
    toggle_bottom_window_command = nil, -- 底部终端窗口的自定义命令
  },

  ------------------------------------
  --          共享 LSP 密钥          --
  ------------------------------------

  ---@class LSPConfig
  lsp = {
    -- 跳转到定义
    definition = "gd",
    -- 跳转到声明，许多服务器不实现此方法
    declaration = false,
    -- 显示悬停信息
    hover = "gh",
    -- 列出所有实现
    implementation = "gi",
    -- 列出所有引用到的符号
    references = "gr",
    -- 重命名
    rename = "<leader>rn",
    -- 代码操作，如快速修复、重构等
    code_action = "<leader>ca",
    -- 格式化代码
    format = "<leader>f",
    -- 诊断
    open_flow = "gp", -- 打开诊断流面板
    goto_next = "gj", -- 跳转到下一个诊断
    goto_prev = "gk", -- 跳转到上一个诊断
    list = "gl", -- 列出当前文档的所有诊断
  },

  ------------------------------------
  -- 共享 DAP 密钥
  ------------------------------------

  ---@class DAPConfig
  dap = {
    -- 开始/停止调试会话
    continue = "<leader>dc",
    -- 终止调试会话
    terminate = "<leader>de",
    -- 单步执行，单步跳入，单步跳出
    step_over = "<leader>dj", -- 单步跳过（Step Over）
    step_into = "<leader>di", -- 单步跳入（Step Into）
    step_out = "<leader>do", -- 单步跳出（Step Out）
    -- 断点管理
    toggle_breakpoint = "<leader>dt", -- 切换断点
    clear_breakpoints = "<leader>dT", -- 清除所有断点
    -- 在调试时计算表达式的值
    eval = "<leader>dh", -- 评估表达式
  },

  ------------------------------------
  -- 共享测试密钥
  ------------------------------------

  ---@class NeotestConfig
  neotest = {
    toggle = "<leader>nt", -- 切换测试视图的显示与隐藏
    run = "<leader>nr", -- 运行测试
    run_file = "<leader>nf", -- 运行当前文件的测试
    run_dap = "<leader>nd", -- 通过 DAP 运行测试
    run_stop = "<leader>ns", -- 停止正在运行的测试
    output_open = "<leader>gh", -- 打开测试输出面板
  },

  ------------------------------------
  -- 语言配置
  ------------------------------------

  ---@class FrontendConfig
  frontend = {
    enable = true, -- 是否启用前端相关配置
    linter = "eslint_d", -- 代码检查工具
    ---@type "eslint_d" | "prettier" | "tsserver"
    formatter = "tsserver", -- 代码格式化工具
    format_on_save = false, -- 是否在保存时自动格式化代码
    cspell = false, -- 是否启用拼写检查
    tailwindcss = true, -- 是否启用Tailwind CSS支持
    prisma = false, -- 是否启用Prisma支持
    -- Vue会接管TypeScript的语言服务器（LSP）
    vue = false,
    -- typescript.nvim提供的额外LSP命令
    typescript = {
      keys = {
        ts_organize = "gs", -- 组织imports
        ts_rename_file = "gR", -- 重命名文件
        ts_add_missing_import = "ga", -- 添加缺失的import
        ts_remove_unused = "gu", -- 移除未使用的代码
        ts_fix_all = "gf", -- 修复所有问题
        ts_goto_source = "gD", -- 跳转到源码定义
      },
    },
  },

  ---@class ClangdConfig
  clangd = {
    enable = false, -- 是否启用Clangd配置
    lsp = "ccls", -- 指定使用ccls作为语言服务器
    -- linter = "clangd-tidy",  -- 静态代码分析工具（未启用）
    formatter = "clang-format", -- 指定使用clang-format作为代码格式化工具
    format_on_save = false, -- 保存时是否自动格式化
  },

  ---@class GolangConfig
  golang = {
    enable = true, -- 是否启用Go语言配置
    lsp = "gopls", -- 指定使用gopls作为语言服务器
    linter = "golangci-lint", -- 指定使用golangci-lint作为代码检查工具
    formatter = "gofmt", -- 指定使用gofmt作为代码格式化工具
    format_on_save = false, -- 保存时是否自动格式化
  },

  ---@class LuaConfig
  lua = {
    enable = true, -- 是否启用Lua语言配置
    lsp = "lua_ls", -- 指定使用lua_ls作为语言服务器
    formatter = "stylua", -- 指定使用stylua作为代码格式化工具
    format_on_save = true, -- 保存时是否自动格式化
  },

  ---@class RustConfig
  rust = {
    enable = false, -- 是否启用Rust语言配置
    lsp = "rust_analyzer", -- 指定使用rust_analyzer作为语言服务器
    -- rustup component add rustfmt  -- 安装rustfmt的提示
    formatter = "rustfmt", -- 指定使用rustfmt作为代码格式化工具
    format_on_save = false, -- 保存时是否自动格式化
  },

  ---@class BashConfig
  bash = {
    enable = true, -- 是否启用Bash脚本配置
    lsp = "bashls", -- 指定使用bashls作为语言服务器
    --  brew install shfmt  -- 安装shfmt的提示（macOS）
    formatter = "shfmt", -- 指定使用shfmt作为代码格式化工具
    format_on_save = false, -- 保存时是否自动格式化
  },

  ---@class PythonConfig
  python = {
    enable = true, -- 是否启用Python语言配置
    -- 可以是pylsp或pyright
    lsp = "pyright", -- 指定使用pylsp作为语言服务器
    -- pip install black  -- 安装black的提示
    -- asdf reshim python  -- 安装black后需要执行的命令
    formatter = "black", -- 指定使用black作为代码格式化工具
    format_on_save = false, -- 保存时是否自动格式化
  },

  ---@class RubyConfig
  ruby = {
    enable = false, -- 是否启用Ruby语言配置
    lsp = "ruby_ls", -- 指定使用ruby_ls作为语言服务器
    -- gem install rubocop  -- 安装rubocop的提示
    formatter = "rubocop", -- 指定使用rubocop作为代码格式化工具
    format_on_save = false, -- 保存时是否自动格式化
  },

  ---@class JsonConfig
  json = {
    enable = true, -- 是否启用JSON语言配置
    lsp = "jsonls", -- 指定使用jsonls作为语言服务器
    -- npm install -g fixjson  -- 安装fixjson的提示
    ---@type "fixjson" | "prettier"
    formatter = "fixjson", -- 指定使用fixjson作为代码格式化工具
    format_on_save = false, -- 保存时是否自动格式化
  },

  ---@class MarkdownConfig
  markdown = {
    enable = true, -- 是否启用Markdown语言配置
    mkdnflow = {
      next_link = "gn", -- 跳转到下一个链接
      prev_link = "gp", -- 跳转到上一个链接
      next_heading = "gj", -- 跳转到下一个标题
      prev_heading = "gk", -- 跳转到上一个标题
      go_back = "<C-o>", -- 返回上一个浏览位置
      follow_link = "gd", -- 跟随链接跳转
      toggle_item = "tt", -- 切换Markdown列表项的勾选状态
    },
    formatter = "prettier", -- 指定使用prettier作为代码格式化工具
    format_on_save = false, -- 保存时是否自动格式化
    wrap = true, -- 是否自动换行
    ---@type "dark" | "light"
    theme = "dark", -- 主题设置为深色模式
  },

  ---@class TomlConfig
  toml = {
    enable = true, -- 是否启用TOML语言配置
    lsp = "taplo", -- 指定使用taplo作为语言服务器
  },

  ---@class YamlConfig
  yaml = {
    enable = true, -- 是否启用YAML语言配置
    lsp = "yamlls", -- 指定使用yamlls作为语言服务器
    formatter = "prettier", -- 指定使用prettier作为代码格式化工具
    format_on_save = false, -- 保存时是否自动格式化
  },

  ---@class DockerConfig
  docker = {
    enable = true, -- 是否启用Docker配置
    lsp = "dockerls", -- 指定使用dockerls作为语言服务器
  },

  ---@class SolidityConfig
  solidity = {
    enable = false, -- 是否启用Solidity（智能合约编程语言）配置
  },

  ---@class JavaConfig
  java = {
    enable = true, -- 是否启用Java语言配置
  },

  ---@class GitConfig
  git = {
    enable = true, -- 是否启用git集成
    code_actions = "gitsigns", -- 使用gitsigns插件提供的代码操作
    -- 签名显示相关设置
    signcolumn = true, -- 是否显示git改变标记栏，使用`:Gitsigns toggle_signs`命令切换
    numhl = false, -- 是否高亮显示有改变的行号，使用`:Gitsigns toggle_numhl`命令切换
    linehl = false, -- 是否高亮显示当前行，使用`:Gitsigns toggle_linehl`命令切换
    word_diff = false, -- 是否显示单词级别的差异，使用`:Gitsigns toggle_word_diff`命令切换
    current_line_blame = false, -- 是否显示当前行的git责任信息，使用`:Gitsigns toggle_current_line_blame`命令切换
  },

  ---@class MirrorConfig
  mirror = {
    -- treesitter源镜像设置，可以指定为其他源
    treesitter = false, -- 当前未启用自定义treesitter镜像
    packer = "https://github.com/", -- 插件管理器packer使用的镜像源
    -- TODO: LSP DAP mirror config
    -- LSP和DAP的镜像源配置，根据需要小心更改这些值
  },
}

return UserConfig
